gsk: Drop modelview/projection from GskRenderer API
authorEmmanuele Bassi <ebassi@gnome.org>
Wed, 10 Aug 2016 16:50:03 +0000 (17:50 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:49:14 +0000 (11:49 +0100)
The details of the modelview and projection matrices are only useful for
the GL renderer; there's really no point in having those details
available in the generic API — especially as the Cairo fallback renderer
cannot really set up a complex modelview or a projection matrix.

gsk/gskglrenderer.c
gsk/gskrenderer.c
gsk/gskrenderer.h
gtk/gtkwindow.c

index dfb995a99c4d50145a8f8b0562007c43b0072f09..c343f4c91c96c4cc03551fb5c80c611eeb6adee0 100644 (file)
@@ -595,15 +595,16 @@ render_node_needs_render_target (GskRenderNode *node)
 }
 
 static void
-gsk_gl_renderer_add_render_item (GskGLRenderer *self,
-                                 GArray        *render_items,
-                                 GskRenderNode *node,
-                                 RenderItem    *parent)
+gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
+                                 const graphene_matrix_t *projection,
+                                 GArray                  *render_items,
+                                 GskRenderNode           *node,
+                                 RenderItem              *parent)
 {
   graphene_rect_t viewport;
   cairo_surface_t *surface;
   GskRenderNodeIter iter;
-  graphene_matrix_t mv, projection;
+  graphene_matrix_t mv;
   graphene_rect_t bounds;
   GskRenderNode *child;
   RenderItem item;
@@ -650,6 +651,7 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
   /* The location of the item, in normalized world coordinates */
   gsk_render_node_get_world_matrix (node, &mv);
   graphene_matrix_multiply (&mv, &self->mvp, &item.mvp);
+  item.z = project_item (projection, &mv);
 
   item.opaque = gsk_render_node_is_opaque (node);
   item.opacity = gsk_render_node_get_opacity (node);
@@ -740,9 +742,6 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
                                          vertex_data);
   }
 
-  gsk_renderer_get_projection (GSK_RENDERER (self), &projection);
-  item.z = project_item (&projection, &mv);
-
   GSK_NOTE (OPENGL, g_print ("%*sAdding node <%s>[%p] to render items\n",
                              2 * node_depth (node), "",
                              node->name != NULL ? node->name : "unnamed",
@@ -756,12 +755,13 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
 out:
   gsk_render_node_iter_init (&iter, node);
   while (gsk_render_node_iter_next (&iter, &child))
-    gsk_gl_renderer_add_render_item (self, render_items, child, ritem);
+    gsk_gl_renderer_add_render_item (self, projection, render_items, child, ritem);
 }
 
 static gboolean
-gsk_gl_renderer_validate_tree (GskGLRenderer *self,
-                               GskRenderNode *root)
+gsk_gl_renderer_validate_tree (GskGLRenderer           *self,
+                               GskRenderNode           *root,
+                               const graphene_matrix_t *projection)
 {
   int n_nodes;
 
@@ -780,7 +780,7 @@ gsk_gl_renderer_validate_tree (GskGLRenderer *self,
   gsk_gl_driver_begin_frame (self->gl_driver);
 
   GSK_NOTE (OPENGL, g_print ("RenderNode -> RenderItem\n"));
-  gsk_gl_renderer_add_render_item (self, self->render_items, root, NULL);
+  gsk_gl_renderer_add_render_item (self, projection, self->render_items, root, NULL);
 
   GSK_NOTE (OPENGL, g_print ("Total render items: %d of max:%d\n",
                              self->render_items->len,
@@ -819,9 +819,12 @@ gsk_gl_renderer_clear (GskGLRenderer *self)
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 }
 
+#define ORTHO_NEAR_PLANE        -10000
+#define ORTHO_FAR_PLANE          10000
+
 static void
-gsk_gl_renderer_render (GskRenderer *renderer,
-                        GskRenderNode *root,
+gsk_gl_renderer_render (GskRenderer       *renderer,
+                        GskRenderNode     *root,
                         GdkDrawingContext *context)
 {
   GskGLRenderer *self = GSK_GL_RENDERER (renderer);
@@ -848,14 +851,20 @@ gsk_gl_renderer_render (GskRenderer *renderer,
   gsk_gl_renderer_create_buffers (self, viewport.size.width, viewport.size.height, scale_factor);
   gsk_gl_driver_end_frame (self->gl_driver);
 
-  gsk_renderer_get_modelview (renderer, &modelview);
-  gsk_renderer_get_projection (renderer, &projection);
+  /* Set up the modelview and projection matrices to fit our viewport */
+  graphene_matrix_init_scale (&modelview, scale_factor, scale_factor, 1.0);
+  graphene_matrix_init_ortho (&projection,
+                              0, viewport.size.width * scale_factor,
+                              viewport.size.height * scale_factor, 0,
+                              ORTHO_NEAR_PLANE,
+                              ORTHO_FAR_PLANE);
+
   gsk_gl_renderer_update_frustum (self, &modelview, &projection);
 
   get_gl_scaling_filters (GSK_RENDERER (self),
                           &self->gl_min_filter,
                           &self->gl_mag_filter);
-  if (!gsk_gl_renderer_validate_tree (self, root))
+  if (!gsk_gl_renderer_validate_tree (self, root, &projection))
     goto out;
 
   gsk_gl_driver_begin_frame (self->gl_driver);
index 926ad03a7955690ed8764e2790fb801520ed9aa6..5d97d8546762818849702a1e7db7dc47bfcf72eb 100644 (file)
@@ -60,8 +60,6 @@ typedef struct
   GObject parent_instance;
 
   graphene_rect_t viewport;
-  graphene_matrix_t modelview;
-  graphene_matrix_t projection;
 
   GskScalingFilter min_filter;
   GskScalingFilter mag_filter;
@@ -84,8 +82,6 @@ G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GskRenderer, gsk_renderer, G_TYPE_OBJECT)
 
 enum {
   PROP_VIEWPORT = 1,
-  PROP_MODELVIEW,
-  PROP_PROJECTION,
   PROP_MINIFICATION_FILTER,
   PROP_MAGNIFICATION_FILTER,
   PROP_AUTO_CLEAR,
@@ -153,14 +149,6 @@ gsk_renderer_set_property (GObject      *gobject,
       gsk_renderer_set_viewport (self, g_value_get_boxed (value));
       break;
 
-    case PROP_MODELVIEW:
-      gsk_renderer_set_modelview (self, g_value_get_boxed (value));
-      break;
-
-    case PROP_PROJECTION:
-      gsk_renderer_set_projection (self, g_value_get_boxed (value));
-      break;
-
     case PROP_MINIFICATION_FILTER:
       gsk_renderer_set_scaling_filters (self, g_value_get_enum (value), priv->mag_filter);
       break;
@@ -207,14 +195,6 @@ gsk_renderer_get_property (GObject    *gobject,
       g_value_set_boxed (value, &priv->viewport);
       break;
 
-    case PROP_MODELVIEW:
-      g_value_set_boxed (value, &priv->modelview);
-      break;
-
-    case PROP_PROJECTION:
-      g_value_set_boxed (value, &priv->projection);
-      break;
-
     case PROP_MINIFICATION_FILTER:
       g_value_set_enum (value, priv->min_filter);
       break;
@@ -296,60 +276,6 @@ gsk_renderer_class_init (GskRendererClass *klass)
                        G_PARAM_STATIC_STRINGS |
                        G_PARAM_EXPLICIT_NOTIFY);
 
-  /**
-   * GskRenderer:modelview:
-   *
-   * The initial modelview matrix used by the #GskRenderer.
-   *
-   * If set to %NULL, the identity matrix:
-   *
-   * |[<!-- language="plain"
-   *   | 1.0, 0.0, 0.0, 0.0 |
-   *   | 0.0, 1.0, 0.0, 0.0 |
-   *   | 0.0, 0.0, 1.0, 0.0 |
-   *   | 0.0, 0.0, 0.0, 1.0 |
-   * ]|
-   *
-   * Is used instead.
-   *
-   * Since: 3.22
-   */
-  gsk_renderer_properties[PROP_MODELVIEW] =
-    g_param_spec_boxed ("modelview",
-                       "Modelview",
-                       "The modelview matrix used by the renderer",
-                       GRAPHENE_TYPE_MATRIX,
-                       G_PARAM_READWRITE |
-                       G_PARAM_STATIC_STRINGS |
-                       G_PARAM_EXPLICIT_NOTIFY);
-
-  /**
-   * GskRenderer:projection:
-   *
-   * The projection matrix used by the #GskRenderer.
-   *
-   * If set to %NULL, the identity matrix:
-   *
-   * |[<!-- language="plain"
-   *   | 1.0, 0.0, 0.0, 0.0 |
-   *   | 0.0, 1.0, 0.0, 0.0 |
-   *   | 0.0, 0.0, 1.0, 0.0 |
-   *   | 0.0, 0.0, 0.0, 1.0 |
-   * ]|
-   *
-   * Is used instead.
-   *
-   * Since: 3.22
-   */
-  gsk_renderer_properties[PROP_PROJECTION] =
-    g_param_spec_boxed ("projection",
-                       "Projection",
-                       "The projection matrix used by the renderer",
-                       GRAPHENE_TYPE_MATRIX,
-                       G_PARAM_READWRITE |
-                       G_PARAM_STATIC_STRINGS |
-                       G_PARAM_EXPLICIT_NOTIFY);
-
   /**
    * GskRenderer:minification-filter:
    *
@@ -489,9 +415,6 @@ gsk_renderer_init (GskRenderer *self)
 {
   GskRendererPrivate *priv = gsk_renderer_get_instance_private (self);
 
-  graphene_matrix_init_identity (&priv->modelview);
-  graphene_matrix_init_identity (&priv->projection);
-
   priv->profiler = gsk_profiler_new ();
 
   priv->auto_clear = TRUE;
@@ -555,101 +478,6 @@ gsk_renderer_get_viewport (GskRenderer     *renderer,
   graphene_rect_init_from_rect (viewport, &priv->viewport);
 }
 
-/**
- * gsk_renderer_set_modelview:
- * @renderer: a #GskRenderer
- * @modelview: the modelview matrix used by the @renderer
- *
- * Sets the initial modelview matrix used by the #GskRenderer.
- *
- * A modelview matrix defines the initial transformation imposed
- * on the scene graph.
- *
- * Since: 3.22
- */
-void
-gsk_renderer_set_modelview (GskRenderer             *renderer,
-                            const graphene_matrix_t *modelview)
-{
-  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
-
-  g_return_if_fail (GSK_IS_RENDERER (renderer));
-
-  if (modelview == NULL)
-    graphene_matrix_init_identity (&priv->modelview);
-  else
-    graphene_matrix_init_from_matrix (&priv->modelview, modelview);
-
-  g_object_notify_by_pspec (G_OBJECT (renderer), gsk_renderer_properties[PROP_MODELVIEW]);
-}
-
-/**
- * gsk_renderer_get_modelview:
- * @renderer: a #GskRenderer
- * @modelview: (out caller-allocates): return location for the modelview matrix
- *
- * Retrieves the modelview matrix used by the #GskRenderer.
- *
- * Since: 3.22
- */
-void
-gsk_renderer_get_modelview (GskRenderer       *renderer,
-                            graphene_matrix_t *modelview)
-{
-  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
-
-  g_return_if_fail (GSK_IS_RENDERER (renderer));
-  g_return_if_fail (modelview != NULL);
-
-  graphene_matrix_init_from_matrix (modelview, &priv->modelview);
-}
-
-/**
- * gsk_renderer_set_projection:
- * @renderer: a #GskRenderer
- * @projection: the projection matrix used by the @renderer
- *
- * Sets the projection matrix used by the #GskRenderer.
- *
- * Since: 3.22
- */
-void
-gsk_renderer_set_projection (GskRenderer             *renderer,
-                             const graphene_matrix_t *projection)
-{
-  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
-
-  g_return_if_fail (GSK_IS_RENDERER (renderer));
-
-  if (projection == NULL)
-    graphene_matrix_init_identity (&priv->projection);
-  else
-    graphene_matrix_init_from_matrix (&priv->projection, projection);
-
-  g_object_notify_by_pspec (G_OBJECT (renderer), gsk_renderer_properties[PROP_PROJECTION]);
-}
-
-/**
- * gsk_renderer_get_projection:
- * @renderer: a #GskRenderer
- * @projection: (out caller-allocates): return location for the projection matrix
- *
- * Retrieves the projection matrix used by the #GskRenderer.
- *
- * Since: 3.22
- */
-void
-gsk_renderer_get_projection (GskRenderer       *renderer,
-                             graphene_matrix_t *projection)
-{
-  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
-
-  g_return_if_fail (GSK_IS_RENDERER (renderer));
-  g_return_if_fail (projection != NULL);
-
-  graphene_matrix_init_from_matrix (projection, &priv->projection);
-}
-
 /**
  * gsk_renderer_set_scaling_filters:
  * @renderer: a #GskRenderer
index 7928917622ca9c65dc4c340a3150577337bc557d..28c587ad0c86ca585ff6aa7f3ee7982b4c66e78d 100644 (file)
@@ -49,18 +49,6 @@ GDK_AVAILABLE_IN_3_22
 void                    gsk_renderer_get_viewport               (GskRenderer             *renderer,
                                                                  graphene_rect_t         *viewport);
 GDK_AVAILABLE_IN_3_22
-void                    gsk_renderer_set_projection             (GskRenderer             *renderer,
-                                                                 const graphene_matrix_t *projection);
-GDK_AVAILABLE_IN_3_22
-void                    gsk_renderer_get_projection             (GskRenderer             *renderer,
-                                                                 graphene_matrix_t       *projection);
-GDK_AVAILABLE_IN_3_22
-void                    gsk_renderer_set_modelview              (GskRenderer             *renderer,
-                                                                 const graphene_matrix_t *modelview);
-GDK_AVAILABLE_IN_3_22
-void                    gsk_renderer_get_modelview              (GskRenderer             *renderer,
-                                                                 graphene_matrix_t       *modelview);
-GDK_AVAILABLE_IN_3_22
 void                    gsk_renderer_set_scaling_filters        (GskRenderer             *renderer,
                                                                  GskScalingFilter         min_filter,
                                                                  GskScalingFilter         mag_filter);
index 4b10b409ff5df93c1d8db5e85083023ad21a6af4..21b0cd52d616fdbf17e3722bd3e503588359f77c 100644 (file)
  * instead.
  */
 
-#define ORTHO_NEAR_PLANE        -10000
-#define ORTHO_FAR_PLANE          10000
-
 typedef struct _GtkWindowPopover GtkWindowPopover;
 
 struct _GtkWindowPopover
@@ -7251,9 +7248,6 @@ _gtk_window_set_allocation (GtkWindow           *window,
   if (priv->renderer != NULL)
     {
       graphene_rect_t viewport;
-      graphene_matrix_t projection;
-      graphene_matrix_t modelview;
-      graphene_point3d_t tmp;
       int scale;
 
       scale = gtk_widget_get_scale_factor (widget);
@@ -7261,17 +7255,6 @@ _gtk_window_set_allocation (GtkWindow           *window,
 
       graphene_rect_init (&viewport, 0, 0, allocation->width, allocation->height);
       gsk_renderer_set_viewport (priv->renderer, &viewport);
-
-      graphene_matrix_init_ortho (&projection,
-                                  0, allocation->width * scale,
-                                  allocation->height * scale, 0,
-                                  ORTHO_NEAR_PLANE,
-                                  ORTHO_FAR_PLANE);
-      gsk_renderer_set_projection (priv->renderer, &projection);
-
-      graphene_matrix_init_translate (&modelview,
-                                      graphene_point3d_init (&tmp, 0.f, 0.f, 0.f));
-      gsk_renderer_set_modelview (priv->renderer, &modelview);
     }
 
   get_shadow_width (window, &window_border);